HAOJX

kubernetes DaemonSet是如何保证pod只在一个节点上运行并且保证数量是1

字数统计: 390阅读时长: 1 min
2019/03/01 Share

首先DaemonSet Controller会从Etcd里获取node的节点列表, 之后一个一个区遍历检查,看看node是不是有一个特定的label(这个label是创建DaemonSet 时指定的,即spec.template.metadata.labels) , 如果有这个pod就不管,没有就创建, 多了就删

在创建pod的时候, 会指定pod在指定的node上创建, 即在创建pod的时候DaemonSet 会自动在pod的API对象上加一个nodeAffinity字段 , 这个字段的作用就是指定pod只能运行在当前节点

这个字段的具体增加是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: metadata.name
operator: In
values:
- node-test

上述的含义是:

requiredDuringSchedulingIgnoredDuringExecution:每次调度的时候予以考虑

而且只能运行在metadata.namenode-test的节点上 ,上面的opetator:In表示部分匹配,如果是完全匹配则是operator:Equal

同时DaemonSet会自动加一个tolerations字段, 意味着会容忍(tolerations)某些污点(Taint)

会自动加上格式如下:

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
name: with-toleration
spec:
tolerations:
- key: node.kubernetes.io/unschedulable
operator: Exists
effect: NoSchedule

例子:

在kubernetes中, 一个节点的网络插件没有被安装上的时候会自动增加一个名为:node.kubernetes.io/network-unavailable的污点

而DaemonSet部署一个网络插件的时候必须在这个DaemonSet的yaml文件里,加上一个能够容忍node.kubernetes.io/network-unavailable污点的toleration

比如:

1
2
3
4
5
6
7
8
9
10
...
template:
metadata:
labels:
name: network-plugin-agent
spec:
tolerations:
- key: node.kubernetes.io/network-unavailable
operator: Exists
effect: NoSchedule

这样在调度的时候, kubernetes就会了忽略这个污点, 成功将其调度起来

CATALOG